﻿package appLoader.loaders {

	import flash.system.ApplicationDomain;
	import flash.display.MovieClip;
	import flash.display.LoaderInfo;	

	public class LoaderInfoUtils {
		
		private static var _loaderInfoApplication:LoaderInfo;
		private static var _loaderInfoMainLoader:LoaderInfo;
		
		/**
		 * Verifica se a aplicação está rodando sob um protocolo http
		 * @param	lo
		 * @return
		 */
		static public function isInBrowser(lo:LoaderInfo = null):Boolean {
			if (lo == null) lo = _loaderInfoApplication;
			return ((lo != null) ? (lo.url.indexOf("http") > -1) : false);
		}
		
		/**
		 * Verifica se a aplicação encontra-se sob determinado host
		 * @param	host
		 * @param	lo
		 * @return
		 */
		static public function isOnHost(host:String, lo:LoaderInfo = null):Boolean {
			if (lo == null) lo = _loaderInfoApplication;
			if (lo != null) {
				return (lo.url.indexOf(host) > -1);
			} else {
				return false;
			}
		}
		
		/**
		 * Recebe um nome de classe, e um loaderInfo para obter uma instância dessa classe.
		 * @param	name		-> Nome da classe desejada
		 * @param	loaderInfo 	-> LoaderInfo de referência. Se a classe já recebeu um default, pode ser omitido.
		 * @return  instância da classe '@param name'.
		 */
		static public function getSimbolFromLibrary(name:String, loaderInfo:LoaderInfo = null):* {
			var lo:LoaderInfo = _loaderInfoApplication;
			if (loaderInfo != null) lo = loaderInfo;
			
			//trace("Erro! Não há loaderInfo para referência de obtenção da instância. Passe um loaderInfo default para a classe LoaderInfoUtils");
			if (lo == null) return null;
			var c:Class = getClassFromLibrary(name, lo);
			if (c == null) return null;
			var instance:* = new c();
			return instance;
		}
		
		/**
		 * Pega uma instância de um objeto MovieClip da library
		 * @param	loaderInfo
		 * @param	name
		 * @return
		 */
		static public function getMovieClipFromLibrary(loaderInfo:LoaderInfo, name:String):MovieClip {
			var c:Class = getClassFromLibrary(name, loaderInfo);
			if(c == null) return null;
			var mc:MovieClip = new c() as MovieClip;
			return mc;	
		}
	
		/**
		 * Pega uma classe da library
		 * @param	loaderInfo
		 * @param	name
		 * @return
		 */
		static public function getClassFromLibrary(className:String, loaderInf:LoaderInfo = null):Class {
			var lo:LoaderInfo = _loaderInfoApplication;
			if (loaderInf != null) lo = loaderInf;
			if (lo == null) return null;
			var t:ApplicationDomain = lo.applicationDomain;
			var hasDef:Boolean = t.hasDefinition(className);
			if (!hasDef) {
				trace("Não foi encontrada na library a classe " + className);
				return null;
			}
			var c:Class = t.getDefinition(className) as Class;
			return c;
		}
		
		
		/**
		 * Seta um LoaderInfo default para a classe trabalhar. Normalmente trata-se do loaderInfo do objeto Main
		 */
		static public function get loaderInfoApplication():LoaderInfo { return _loaderInfoApplication; }
		static public function set loaderInfoApplication(value:LoaderInfo):void {
			_loaderInfoApplication = value;
		}
		
		static public function get loaderInfoMainLoader():LoaderInfo { return _loaderInfoMainLoader; }
		static public function set loaderInfoMainLoader(value:LoaderInfo):void {
			_loaderInfoMainLoader = value;
		}
	}

	
}